//
//  HomeTableViewController.swift
//  HMWeibo
//
//  Created by wulei on 15/12/6.
//  Copyright © 2015年 wulei. All rights reserved.
//

import UIKit
import SVProgressHUD

/// 原创微博Cell 的重用标识符
let HMStatusCellNormalID = "HMStatusCellNormalID"

 /// 转发微博Cell 的重用标识符
let HMStatusRetweetedCellID = "HMStatusRetweetedCellID"


class HomeTableViewController: VisitorTableViewController {

    /// 懒加载微博数据列表模型
    private lazy var listViewModel = HMStatusListViewModel()

    
    override func viewDidLoad() {
        super.viewDidLoad()
        if !HMUserAccountViewModel.sharedUserAccountViewModel.isLogon {
            
            visitorView?.setupViewInfo(nil, title: "关注一些人,回这里看看有什么惊喜")
            return
        }
    
        prepareTableView()
        loadStatus()
        
//        refreshControl?.beginRefreshing()
        
        
        // MARK: - 注册通知
        NSNotificationCenter.defaultCenter().addObserverForName(WBStatusSelecetedPhotoNotification, object: nil, queue: nil) { [weak self](n) -> Void in
            
            guard let indexPath = n.userInfo?[WBStatusSelecetedPhotoIndexPathKey] as? NSIndexPath else{
                return
            }
            
            guard let URLs = n.userInfo?[WBStatusSelecetedPhotoURLsKey] as? [NSURL] else{
                return
            }
            
            guard let cell = n.object as? PhotoBrowserPresentDelegate else {
                return
            }
            
            
            let VC = PhotoBrowserViewController(urls: URLs, indexPath: indexPath)
            
            // 1.设置modal的类型
            VC.modalPresentationStyle = UIModalPresentationStyle.Custom
            
            // 2.设置动画的代理
            VC.transitioningDelegate = self?.photoBrowserAnimator
            
            self?.photoBrowserAnimator.setDelegateParams(cell, indexPath: indexPath, dismissDelegate: VC)
            
            // 3.moda 展现
            self?.presentViewController(VC, animated: true, completion: nil)
    
    }
}
    
    
    // 注销通知
    deinit {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
    

    
//MARK: - 注册可重用Cell
    func prepareTableView() {
//            refreshControl?.beginRefreshing()
        tableView.separatorStyle = .None
        
        tableView.registerClass(StatusNormalCell.self, forCellReuseIdentifier: HMStatusCellNormalID)
        tableView.registerClass(StatusRetweetedCell.self, forCellReuseIdentifier: HMStatusRetweetedCellID)
        
        // 自动计算行高使用原则
        // 1> 需要一个自上而下的自动布局的控件,指定一个向下的约束
        // 2> 需要一个预估的行高
        
        // 自动计算行高的使用原则
        // 1> 先从上往下计算控件的位置
        // 2> 然后从下向上按着底部的约束挤到最合适的高度
                //估计
        tableView.estimatedRowHeight = 400
                                                 // 维,次元,容积,规格
//        tableView.rowHeight = UITableViewAutomaticDimension
//        tableView.rowHeight = 400
        
        // MARK: - 下拉刷新
        // ,RefreshControl = UIRefreshControl() UIRefreshControl 继承自UIControl -> UIView
        refreshControl = WBRefreshViewControl()
        
        // 添加监听事件
        refreshControl?.addTarget(self, action: "loadStatus", forControlEvents: UIControlEvents.ValueChanged)
        
        // UIRefreshControlContentview
//        let V = UIView(frame: CGRect(x: 0, y: 0, width: 180, height: 40))
//        V.backgroundColor = UIColor.blueColor()
//        refreshControl?.addSubview(V)
        
        

       
        
        // 如果这里是 addSubview 是无法显示的 一定要注意
        tableView.tableFooterView = pullupView
        
    }

/// 加载数据
   @objc private func loadStatus() {

    refreshControl?.beginRefreshing()
    
    
        listViewModel.loadStatus(isPullup: pullupView.isAnimating()) { (isSuccess) -> () in
            
            self.refreshControl?.endRefreshing()
            self.pullupView.stopAnimating()
            
            if !isSuccess {
                SVProgressHUD.showInfoWithStatus("加载错误,请稍后再试")
                return
            }
            
             self.tableView.reloadData()
//            print(self.listViewModel.statusList)
        }

    }

    // MRAK: - 懒加载控件 上拉刷新
    private lazy var pullupView: UIActivityIndicatorView = {
        
        let indicator = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        
        indicator.color = UIColor.lightGrayColor()
        return indicator
    }()
    
    lazy var photoBrowserAnimator: PhotoBrowserAnimator = PhotoBrowserAnimator()
}

/*

行高: 会调用多少次

-- 设置预估行高
* 当前 "显示行" 行高方法会调用三次(每个版本的 Xcode 调用次数可能不同)
* 执行: 行数 -> cell -> 行高


-- 没有设置预估行高
* 1.计算所有Cell 的行高高度
* 2.再计算 "显示行" 行高高度
* 执行: 行数 -> 行高 -> cell



-- 为什么会调用行高的方法
* UITableView 继承自 UIScrollView,要想很流畅的滚动视图,就要计算出 contentSize 的大小

-- 为什么预估行高不同,计算次数也不同
* 使用预估行高,计算出预估的 contentSize
* 根据预估行高,判断计算次数,顺序计算每一行的行高,更新contentSize
* 如果预估行高过大,超出预估范围,顺序计算后续行高,一直到填满屏幕退出,同时更新contentSize
* 使用预估行高,每个cell 显示前需要计算,单个cell 效率是低的,但整体是高的


*** 预估行高 尽量靠近
*** 苹果官方文档指出: 如果行高是固定值,就不要实现行高方法
*** 实际开发中,行高一定要保存
*/

//MARK: - 数据源方法
extension HomeTableViewController {
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return listViewModel.statusList.count
    }
    
    
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 不推荐使用如下方法: 因为此方法不用调用行高
//        tableView.dequeueReusableCellWithIdentifier(identifier: String)
        

        
        
        let vm = listViewModel.statusList[indexPath.row]
        
        let cell = tableView.dequeueReusableCellWithIdentifier(vm.cellID, forIndexPath: indexPath) as! StatusCell
        
//        cell.textLabel?.text = listViewModel.statusList[indexPath.row].status.user?.screen_name
        
        if indexPath.row == listViewModel.statusList.count - 1 && !pullupView.isAnimating() {
            pullupView.startAnimating()
            loadStatus()
            print("上拉刷新数据")
        }
        
        cell.ViewModel = vm
        return cell
    }
    
    
    
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
      return listViewModel.statusList[indexPath.row].rowHeight
    }
}


